/*******************************************************************************
 * @brief: 参数设置
 * @Author:   aple
 * @Date: 2020-09-02 23:35:00
 * @LastEditors: aple
 * @LastEditTime: 2022-11-12 09:28:40
 * @Verision: 1.0.0.0
 ******************************************************************************/

#ifndef __PARAMETER_N_H_
#define __PARAMETER_N_H_

#include "stdint.h"
#include "par_def.h"

#ifdef __cplusplus
extern "C"
{
#endif

/*-----------------------------------------------------------------------------*
[9]  -HEX显示
[8]  -字参数

[7]--> 1结束
[6]--> 不初始化，并且用户复位时保持
[5]--> 用户复位参数时保持不变
[4]--> 上电复位为初始值

[3]--> 0有该参数，1顺序搜索时跳过
[2]--> 1-增加减少键无效   0-增加减少键有效
[1]--> 0 : 小数点功能
[0]--> 0 ：小数点功能
*-----------------------------------------------------------------------------*/
#define PAR_ATTR_NONE 			0x0000UL

#define PAR_ATTR_POINT_MSK 		0x0003UL
#define PAR_ATTR_POINT(x) 		(x & PAR_ATTR_POINT_MSK)

#define PAR_ATTR_NEDIT			0x0004UL // 用户不可编辑
#define PAR_ATTR_NFUN 			0x0008UL // 无该参数
#define PAR_ATTR_RST 			0x0010UL // 每次上电恢复为初始化值
#define PAR_ATTR_KEEP 			0x0020UL // 执行复位时跳过
#define PAR_ATTR_NINIT 			0x0040UL // 参数初始化或复位时跳过
#define PAR_ATTR_END 			0x0080UL
#define PAR_ATTR_32BIT 			0x0100UL // 32BIT参数
#define PAR_ATTR_WHIGH 			0x0200UL // 32BIT参数的高半字
#define PAR_ATTR_HEX 			0x0400UL // 16进制显示
#define PAR_ATTR_NRANG 			0x0800UL // 无范围参数

/*******************************************************************************
 * @brief  par min get
 *******************************************************************************/
#define SET_ST_EEN_MSK 0x10

#define SET_ST_NONE 			(0)
#define SET_ST_SCAN 			(1)
#define SET_ST_EDIT 			(2 | SET_ST_EEN_MSK)
#define SET_ST_LCK 				(3 | SET_ST_EEN_MSK)
#define SET_ST_SYS 				(4 | SET_ST_EEN_MSK)

	/*参数跳转列表*/
	typedef const struct
	{
		uint16_t src_pos;
		uint16_t des_pos;
	} par_jump_list_type;

	/*管理表*/
	typedef struct
	{
		uint8_t st_set;			 //【Y】 外部管理
		uint8_t st_val_changed;  //【Y】 外部清零，内部设置
		int16_t start_num;		 //【X】 参数组起始编号，前一参数时使用，不允许指向被跳过的参数
		int16_t par_num;		 //【X】 参数编号
		uint16_t par_attr;		 //【X】 参数属性
		u16_tt *tab;			 //【Y】 外部管理，参数组选择
		par_attr_type *attr_tab; //【Y】 外部管理，属性选择
		uint16_t par_amount;	 //【Y】 外部管理
		union
		{
			int32_t ival;
			uint32_t uval;
		} par_val; //【X】

		union
		{
			int32_t ival;
			uint32_t uval;
		} par_val_old; //【X】

		par_jump_list_type *jump_list; //【Y】遇0结束
	} par_manager_type;

	/*******************************************************************************
	 * @brief  par_jump_next
	 * \param[in] par_man
	 * \retval: par_num, 搜索结果par_num如果为0表示参数结束
	 *******************************************************************************/
	uint16_t par_jump_next(par_manager_type *par_man);

	/*******************************************************************************
	 * @brief  par_jump_prev
	 * \param[in] par_man
	 * \retval: par_num, 头位置继续搜索保持不变
	 *******************************************************************************/
	uint16_t par_jump_prev(par_manager_type *par_man);

	/* 强制指定管理器参数号 */
	uint16_t par_jump_set(par_manager_type *par_man, int16_t par_num);

	/* 强制指定管理器参数号, 并将par_num指定为start_num*/
	uint16_t par_jump_start(par_manager_type *par_man, int16_t par_num);

	/* 多组参数时，选择*/
	void par_jump_init(par_manager_type *par_man, u16_tt *par_sel, par_attr_type *attr_sel, uint16_t amount);

#ifdef __cplusplus
}
#endif

#endif /* __PARAMETER_N_H_ */
